# Что я жду от современной С/C++ IDE
1. Работа без мыши, используя только клавиатуру с поддержкой vim/emacs сочетаний клавиш.
2. Сборка проекта без настройки используя CMakeLists.txt - это и есть файл описывающий проект.
3. Автоматическое форматирование кода на сохранение файла (clang-format).
4. Свободная навигация по коду(файлам, папкам, библиотекам и т.д.) без мыши.
5. Автоподстановка методов, параметров, полей типов и т.д.
6. Проверка на ошибки в тексте комментариев и в названиях типов и переменных 
   (возможность добавить слово в исключения)
7. Удобное перемещение по дереву проекта (без мыши)
8. Удобный и быстрый поиск по всему проекту (файлов, классов, методов и просто по тексту)
9. Рефакторинг (минимум - переименование, типов, переменных и т.д.)
10. Отладка:
    а) возможность легко добавить/изменить переменные среды (ENV_VARIABLES)
    б) параметры запуска в терминале (command line arguments)
    в) возможность удаленной отладки
    г) добавление/удаление точек останова, точек слежки, срабатывания исключений
    д) удобное разворачивание std:: структур просмотр данных
11. Поддержка статического анализатора, с удобной подсветкой ошибок-предупреждений
12. Поддержка профилирования (желательно визуализация резултатов)
13. Поддержка работы с проектом на основе git
14. Поддержка документации для всех стандартных типов методов и т.д.
15. Поддержка документации для файлов сборки CMake
16. Подсветка ошибок компиляции прямо при редактировании файла


# Можно ли все выше сказанное сделать без шума и пыли прямо тут в Emacs(spacemacs)?
## 1. можно:
   - перемещение по видимым буферам через alt+0..9
   - максимизация текущего буфера и обратно его минимизация через ctrl+x 1
   - дерево файлов доступно через alt+0
## 2. можно:
   - добавляем в .spacemacs 
        (cmake :variables cmake-backend 'lsp
                          cmake-enable-cmake-ide-support t)
   - создаем файл .dir-locals.el в корне проекта:
   ((nil . ((cmake-ide-cmake-args . ("-DCMAKE_BUILD_TYPE=Debug"
                                  "-DCMAKE_CXX_COMPILER=clang++"
                                  "-DCMAKE_CXX_STANDARD=17"
                                  "-DCMAKE_CXX_EXTENSIONS=OFF"
                                  "-DCMAKE_EXPORT_COMPILE_COMMANDS=ON"))
         (cmake-ide-build-dir . "~/fun/om/build/")
         (cmake-ide-project-dir . "~/fun/om/")
         )))
   - открываем файл CMakeLists.txt и выполняем cmake-ide-run-cmake 
   - собираем проект cmake-ide-compile
## 3. можно: добавляем примерно такое содержимое в .spacemacs
          (c-c++ :variables
            c-c++-backend 'lsp-clangd
            ;;c-c++-dap-adapters '(dap-lldb)
            c-c++-dap-adapters '(dap-cpptools)
            dap-lldb-debug-program '("/usr/bin/lldb-vscode")
            c-c++-enable-clang-format-on-save t
            c-c++-lsp-enable-semantic-highlight t)
## 4. можно: навигация, поиск
   - открыть-закрыть treemacs: (M-m f t)
   - найти файл в проекте по регулярному: helm-projectile-find-file (M-m p f)
   - перейти по текущему символу под курсором (ctrl+.) - обратно (ctrl+,)
   - искать текст по всему проекту: (M-m /) - по всем файлам которые НЕ игнорирует git
   - что бы искать только по нужному типу файлов после (M-m /) нужно написать пример (-tcmake find_package)
## 5. работает из коробки, возможно нужно что-то еще делать, но и так норм.
## 6. spell-checking - работает из коробки для английского - нужно добавить
   - spell-checking в .spacemacs
   - можно добавить слово в глобальный словарь что бы оно не подсвечивалось как неверное
   - для этого (M+x spell-add-dic) - как-то так, и подсмотреть что именно выскочит и добавить
## 7. перемещение по дереву проекта проще всего делать в treemacs
   - alt+0 - попадаем в дерево
   - если забыл клавиши - то в этом дереве можно нажать shift+? - и получишь табличку основных клавиш
   - так же можно создать или удалить папку или файл - создавать - просто нажми клавишу ~c~ а что 
   - бы удалить ~d~
## 8. поиск
   - файлы - смотри пункт 4.
   - классы - ?
   - методов - ?
   - по тексту по всему проекту - смотри пункт 4.
## 9. refactoring
   - переменные, классы, методы - все можно переименовать через - (M-x lsp-rename)
## 10. отладка
   - TODO 
